3.5. 제어 흐름문

조건에 따라 코드를 실행하고, 반복하는 기능은 프로그래밍 언어에서 필수적이다.

if 표현식

흔히 아는 if 문이다.
Pasted image 20240501003251.png
기본적으로 조건식에는 괄호를 작성하지 않는다.
조건식은 무조건 bool 값을 가져야만 한다.

else if도 사용 가능이다.
만약 이것이 중첩된다면, match를 사용하라.

if문은 let 구문에서도 활용 가능하다.
Pasted image 20240501003725.png
실행될 식 안 속을 표현식으로 남겨둔다는 것에 주목하라.
만약 분기에 따라 다른 타입을 반환하도록 코드를 짠다면 컴파일에서 에러가 발생한다.
컴파일러가 변수에 대해 타입을 추정하게 된다면 복잡해지고 확실성이 보장되지 않기에 이렇게 설계된 것이다.

반복문

러스트에는 loop, while, for라는 세 가지의 반복문이 존재한다.

loop

Pasted image 20240501004149.png
loop는 기본적으로 무한 반복을 수행한다.
break를 통해 나와야만 한다.
loop는 실패할 수도 있는 연산을 재시도할 때 활용된다.

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {result}");
}

기본적으로는 break 문 뒤의 값을 반환받는 것이라 보면 된다.
참고로 여기 if 문 뒤에 세미콜론을 붙여도 달라지는 것은 없다.
기본적으로 if 문은 유닛 타입을 반환하고 있었고, loop의 반환은 break에서 이뤄지기 때문이다.

중첩 반복문이 있다면, 라벨을 붙여 모호함을 제거한다.
루프 라벨이라 하며, 작은 따옴표로 시작해야만 한다.

fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");
        let mut remaining = 10;

        loop {
            println!("remaining = {remaining}");
            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }

        count += 1;
    }
    println!("End count = {count}");
}

이 코드의 결과물은 다음과 같다.

count = 0
remaining = 10
remaining = 9
count = 1
remaining = 10
remaining = 9
count = 2
remaining = 10
End count = 2

while

loop를 통해 길어질 코드를 while문으로 해소할 수 있다.

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{number}!");

        number -= 1;
    }

    println!("LIFTOFF!!!");
}

for

복합 타입을 순회할 때는 for문이 유용하다.

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a {
        println!("the value is: {element}");
    }
}

기본적으로 for in 구문만이 유효하다.

fn main() {
    for number in (1..4).rev() {
        println!("{number}!");
    }
    println!("LIFTOFF!!!");
}

단순 숫자를 출력하는 코드를 이렇게도 만들 수 있다.
참고로 1..4할 때는 1부터 3까지의 값을 가지게 된다.
rev는 값을 뒤집는 역할을 한다.